/*
 * Copyright 2001-2005 Stephen Colebourne
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the
 * License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
 * CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
 */
package org.x.starter4j.jodatime;

import java.util.Locale;

import org.joda.time.DateTime;
import org.joda.time.Instant;

/**
 * Example code demonstrating how to use Joda-Time.
 * 
 * @author Stephen Colebourne
 */
public class Examples
{

	public static void main(final String[] args) throws Exception
	{
		try
		{
			new Examples().run();
		}
		catch (Throwable ex)
		{
			ex.printStackTrace();
		}
	}

	private void run()
	{
		runInstant();
		System.out.println();
		runDateTime();
		System.out.println();
	}

	private void runInstant()
	{
		System.out.println("Instant");
		System.out.println("=======");
		System.out.println("Instant stores a point in the datetime continuum as millisecs from 1970-01-01T00:00:00Z");
		System.out.println("Instant is immutable and thread-safe");
		System.out.println("                      in = new Instant()");
		Instant in = new Instant();
		System.out.println("Millisecond time:     in.getMillis():           " + in.getMillis());
		System.out.println("ISO string version:   in.toString():            " + in.toString());
		System.out.println("ISO chronology:       in.getChronology():       " + in.getChronology());
		System.out.println("UTC time zone:        in.getDateTimeZone():     " + in.getZone());
		System.out.println("Change millis:        in.withMillis(0):         " + in.withMillis(0L));
		System.out.println("");
		System.out.println("Convert to Instant:   in.toInstant():           " + in.toInstant());
		System.out.println("Convert to DateTime:  in.toDateTime():          " + in.toDateTime());
		System.out.println("Convert to MutableDT: in.toMutableDateTime():   " + in.toMutableDateTime());
		System.out.println("Convert to Date:      in.toDate():              " + in.toDate());
		System.out.println("");
		System.out.println("                      in2 = new Instant(in.getMillis() + 10)");
		Instant in2 = new Instant(in.getMillis() + 10);
		System.out.println("Equals ms and chrono: in.equals(in2):           " + in.equals(in2));
		System.out.println("Compare millisecond:  in.compareTo(in2):        " + in.compareTo(in2));
		System.out.println("Compare millisecond:  in.isEqual(in2):          " + in.isEqual(in2));
		System.out.println("Compare millisecond:  in.isAfter(in2):          " + in.isAfter(in2));
		System.out.println("Compare millisecond:  in.isBefore(in2):         " + in.isBefore(in2));
	}

	private void runDateTime()
	{
		System.out.println("DateTime");
		System.out.println("=======");
		System.out.println("DateTime stores a the date and time using millisecs from 1970-01-01T00:00:00Z internally");
		System.out.println("DateTime is immutable and thread-safe");
		System.out.println("                      in = new DateTime()");
		DateTime in = new DateTime();
		System.out.println("Millisecond time:     in.getMillis():           " + in.getMillis());
		System.out.println("ISO string version:   in.toString():            " + in.toString());
		System.out.println("ISO chronology:       in.getChronology():       " + in.getChronology());
		System.out.println("Your time zone:       in.getDateTimeZone():     " + in.getZone());
		System.out.println("Change millis:        in.withMillis(0):         " + in.withMillis(0L));
		System.out.println("");
		System.out.println("Get year:             in.getYear():             " + in.getYear());
		System.out.println("Get monthOfYear:      in.getMonthOfYear():      " + in.getMonthOfYear());
		System.out.println("Get dayOfMonth:       in.getDayOfMonth():       " + in.getDayOfMonth());
		System.out.println("...");
		System.out.println("Property access:      in.dayOfWeek().get():                   " + in.dayOfWeek().get());
		System.out.println("Day of week as text:  in.dayOfWeek().getAsText():             " + in.dayOfWeek().getAsText());
		System.out.println("Day as short text:    in.dayOfWeek().getAsShortText():        " + in.dayOfWeek().getAsShortText());
		System.out.println("Day in french:        in.dayOfWeek().getAsText(Locale.FRENCH):" + in.dayOfWeek().getAsText(Locale.FRENCH));
		System.out.println("Max allowed value:    in.dayOfWeek().getMaximumValue():       " + in.dayOfWeek().getMaximumValue());
		System.out.println("Min allowed value:    in.dayOfWeek().getMinimumValue():       " + in.dayOfWeek().getMinimumValue());
		System.out.println("Copy & set to Jan:    in.monthOfYear().setCopy(1):            " + in.monthOfYear().setCopy(1));
		System.out.println("Copy & add 14 months: in.monthOfYear().addCopy(14):           " + in.monthOfYear().addToCopy(14));
		System.out.println("Add 14 mnths in field:in.monthOfYear().addWrapFieldCopy(14):  " + in.monthOfYear().addWrapFieldToCopy(14));
		System.out.println("...");
		System.out.println("Convert to Instant:   in.toInstant():           " + in.toInstant());
		System.out.println("Convert to DateTime:  in.toDateTime():          " + in.toDateTime());
		System.out.println("Convert to MutableDT: in.toMutableDateTime():   " + in.toMutableDateTime());
		System.out.println("Convert to Date:      in.toDate():              " + in.toDate());
		System.out.println("Convert to Calendar:  in.toCalendar(Locale.UK): " + in.toCalendar(Locale.UK).toString().substring(0, 46));
		System.out.println("Convert to GregCal:   in.toGregorianCalendar(): " + in.toGregorianCalendar().toString().substring(0, 46));
		System.out.println("");
		System.out.println("                      in2 = new DateTime(in.getMillis() + 10)");
		DateTime in2 = new DateTime(in.getMillis() + 10);
		System.out.println("Equals ms and chrono: in.equals(in2):           " + in.equals(in2));
		System.out.println("Compare millisecond:  in.compareTo(in2):        " + in.compareTo(in2));
		System.out.println("Compare millisecond:  in.isEqual(in2):          " + in.isEqual(in2));
		System.out.println("Compare millisecond:  in.isAfter(in2):          " + in.isAfter(in2));
		System.out.println("Compare millisecond:  in.isBefore(in2):         " + in.isBefore(in2));
	}

}
